<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 数组中找到与目标值最接近的数字
        // arr=[5,3,7,6,3,5]
        // 场景1：无序数组
        // 通过遍历，依次求出每个元素值和目标值的差值，进行比较更新
        // const arr = [1, 8, 3, 5, 6, 2];
        // function getNumber(array, target) {
        //     let result = array[0];
        //     for (let index = 0; index < array.length; index++) {
        //         if (Math.abs(array[index] - target) < Math.abs(result - target)) {
        //             result = array[index];
        //         }
        //     }
        //     return result
        // }
        // function getNumber(array,target) {
        //     return array.reduce((pre, cur)=>{
        //         return Math.abs(pre - target) < Math.abs(cur - target) ? pre : cur
        //     })
        // }
        // const res1 = getNumber(arr, 4);
        // const res2 = getNumber(arr, 10);
        // console.log(res1); // 5
        // console.log(res2); // 8
        // 场景2：有序的数组：二分查找
        // 1. 取left和right两个索引，每次取出中间索引位mid的值与目标值比较
        //  - 如果中间位的值大于目标值，则想要寻找的值在左侧
        //  - 如果中间位的值小于目标值，则想要寻找的值在右侧
        // 2. 动态更新left和right, 值到指针停留在相邻的两个数
        // 3. 进行最后一次计算，得到于目标值最近的数
        const arr = [1, 3, 5, 6, 8, 10, 19];
        function getNumber2(array, target) {
            let left = 0;
            let right = array.length - 1;
            let mid;
            while (right - left > 1) {
                mid = Math.floor((left + right) / 2)
                if (array[mid] < target) {
                    left = mid;
                } else {
                    right = mid;
                }
            }
            return Math.abs(array[left] - target) > Math.abs(array[right] - target)
                ? array[right] : array[left]
        }
        const res1 = getNumber2(arr, 4);
        const res2 = getNumber2(arr, 10);
        console.log(res1);
        console.log(res2);
    </script>
</body>

</html>